package name.cyrax.red.jpv.api.vectors;

import name.cyrax.red.jpv.api.adapters.OmniNumberAdapter;
import name.cyrax.red.jpv.api.adapters.SizeAdapter;
import name.cyrax.red.jpv.api.funcs.ArityFunctor;
import name.cyrax.red.jpv.api.funcs.BinaryFunctor;
import name.cyrax.red.jpv.api.funcs.Invocable;
import name.cyrax.red.jpv.api.funcs.UnaryFunctor;

public interface Vector<N extends Number> extends SizeAdapter, Invocable<N>
{
	public OmniNumberAdapter<N> adapter();
	public VectorFactory<N> factory();
	
	public Vector<N> 		op(UnaryFunctor op);
	public Vector<Integer> 	opInt(UnaryFunctor op);
	public Vector<Long> 	opLong(UnaryFunctor op);
	public Vector<Double> 	opDouble(UnaryFunctor op);

	public Vector<N> 		op(BinaryFunctor op, Vector<?> v1);
	public Vector<Integer> 	opInt(BinaryFunctor op, Vector<?> v1);
	public Vector<Long> 	opLong(BinaryFunctor op, Vector<?> v1);
	public Vector<Double> 	opDouble(BinaryFunctor op, Vector<?> v1);

	public Vector<N> 		op(ArityFunctor op, Vector<?>[] vN);
	public Vector<Integer> 	opInt(ArityFunctor op, Vector<?>[] vN);
	public Vector<Long> 	opLong(ArityFunctor op, Vector<?>[] vN);
	public Vector<Double> 	opDouble(ArityFunctor op, Vector<?>[] vN);
}
